/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Codigo;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.PatternSyntaxException;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.RowFilter;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 *
 * @author kyerte
 */
public class FrmCasas extends javax.swing.JFrame {

    private ConsultaProductos consultaProductos;
    private List<Corretaje> resultadosCorretaje;
    private List<MobilDesarrollo> resultadosProductosDesarrollo;
    private int numeroProductos;
    private int indiceActual;
    private int idProducto;
    private boolean nuevoProducto;
    private Corretaje corretajeActual;
    private MobilDesarrollo desarrolloActual;
    private ConsultaCaracteristicasProducto consultaCaracteristicasProducto;
    private List<CaracteristicasProducto> resultadosCaracteristicasProducto;
    private int numeroCaracteristicasProducto;
    private int indiceActualCaracteristicas;
    private CaracteristicasProducto caracteristicasActual;
    private int idCaracteristicasProducto;
    boolean desarrollo = false;
    private ModeloTablaVisitas modeloTabla;
    private TableRowSorter<TableModel> sorter;
    private ConsultaClientesXProducto consultaVisitas;

    public FrmCasas() {
        this.setIconImage(new ImageIcon(getClass().getResource("/Imagenes/Casa.png")).getImage());
        initComponents();
        desarrollo = false;
        consultaProductos = new ConsultaProductos(false);
        consultaCaracteristicasProducto = new ConsultaCaracteristicasProducto();
        consultaVisitas = new ConsultaClientesXProducto();

        lblDesarrollo.setVisible(false);
        cboDesarrollo.setVisible(false);

        modeloTabla = new ModeloTablaVisitas(idProducto);
        tablaResultados.setModel(modeloTabla);
        sorter = new TableRowSorter<TableModel>(modeloTabla);
        tablaResultados.setRowSorter(sorter);

        explorarCorretaje();
        explorarCaracteristicasProducto();
        obtenerClientes();

        txtFiltro.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                String texto = txtFiltro.getText();
                if (texto.length() == 0) {
                    sorter.setRowFilter(null);

                } else {
                    try {
                        sorter.setRowFilter(RowFilter.regexFilter(texto));
                    } catch (PatternSyntaxException ex) {
                        JOptionPane.showMessageDialog(null, "Patrón de exp reg incorrecto",
                                "Inmuebles", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }

            @Override
            public void keyPressed(KeyEvent arg0) {
            }

            @Override
            public void keyReleased(KeyEvent arg0) {
            }
        });
    }

    public FrmCasas(boolean desarrollos) {
        this.setIconImage(new ImageIcon(getClass().getResource("/Imagenes/Casa.png")).getImage());
        initComponents();

        consultaProductos = new ConsultaProductos(true);
        consultaCaracteristicasProducto = new ConsultaCaracteristicasProducto();
        consultaVisitas = new ConsultaClientesXProducto();

        lblNombreClave.setText("Modelo");

        desarrollo = desarrollos;

        lblDireccion.setVisible(!desarrollos);
        txtDireccion.setVisible(!desarrollos);
        lblColonia.setVisible(!desarrollos);
        txtColonia.setVisible(!desarrollos);
        lblReferencias.setVisible(!desarrollos);
        txtReferencias.setVisible(!desarrollos);

        lblDesarrollo.setVisible(desarrollos);
        cboDesarrollo.setVisible(desarrollos);

        modeloTabla = new ModeloTablaVisitas(idProducto);
        tablaResultados.setModel(modeloTabla);
        sorter = new TableRowSorter<TableModel>(modeloTabla);
        tablaResultados.setRowSorter(sorter);

        explorarDesarrollo();
        explorarCaracteristicasProducto();
        obtenerDesarrollos();
        obtenerClientes();

        txtFiltro.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                String texto = txtFiltro.getText();
                if (texto.length() == 0) {
                    sorter.setRowFilter(null);

                } else {
                    try {
                        sorter.setRowFilter(RowFilter.regexFilter(texto));
                    } catch (PatternSyntaxException ex) {
                        JOptionPane.showMessageDialog(null, "Patrón de exp reg incorrecto",
                                "Inmuebles", JOptionPane.ERROR_MESSAGE);
                    }
                }
            }

            @Override
            public void keyPressed(KeyEvent arg0) {
            }

            @Override
            public void keyReleased(KeyEvent arg0) {
            }
        });
    }

    private void explorarCorretaje() {

        resultadosCorretaje = consultaProductos.consultarProductosCorretaje();
        numeroProductos = resultadosCorretaje.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            corretajeActual = resultadosCorretaje.get(indiceActual);

            idProducto = corretajeActual.obtenerIdProducto();
            txtNombreClave.setText(corretajeActual.obtenerNombre());
            txtDireccion.setText(corretajeActual.obtenerDireccion());
            txtColonia.setText(corretajeActual.obtenerColonia());
            txtReferencias.setText(corretajeActual.obtenerReferencias());
            cboTipo.setSelectedItem(corretajeActual.obtenerTipo().toString());
            chkVendido.setSelected(corretajeActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);

        } else {
            cmdGuardar.setEnabled(false);
            cmdCancelar.setEnabled(false);
            cmdEliminar.setEnabled(false);
        }
        try {
            modeloTabla.realizarConsulta(idProducto);
            acomodarColumnas();
        } catch (SQLException ex) {
            modeloTabla.desconectarDeBaseDeDatos();
            ex.printStackTrace();
            System.exit(1);
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }
    }

    private void explorarDesarrollo() {

        resultadosProductosDesarrollo = consultaProductos.consultarProductosDesarrollo();
        numeroProductos = resultadosProductosDesarrollo.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            desarrolloActual = resultadosProductosDesarrollo.get(indiceActual);
            idProducto = desarrolloActual.obtenerIdProducto();
            txtNombreClave.setText(desarrolloActual.obtenerNombre());
            cboTipo.setSelectedItem(desarrolloActual.obtenerTipo());
            cboDesarrollo.setSelectedItem(desarrolloActual.obtenerDesarrollo());
            chkVendido.setSelected(desarrolloActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);

        } else {
            cmdGuardar.setEnabled(false);
            cmdCancelar.setEnabled(false);
            cmdEliminar.setEnabled(false);
        }
        try {
            modeloTabla.realizarConsulta(idProducto);
            acomodarColumnas();
        } catch (SQLException ex) {
            modeloTabla.desconectarDeBaseDeDatos();
            ex.printStackTrace();
            System.exit(1);
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }
    }

    private void explorarCaracteristicasProducto() {

        resultadosCaracteristicasProducto = consultaCaracteristicasProducto.
                consultarCaracteristicasProducto(desarrollo);
        numeroCaracteristicasProducto = resultadosCaracteristicasProducto.size();

        if (numeroCaracteristicasProducto != 0) {

            indiceActualCaracteristicas = 0;
            caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);

            idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();

            txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
            txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
            txtPrecio.setText("" + caracteristicasActual.obtenerPrecio());
            txtTerreno.setText("" + caracteristicasActual.obtenerTerreno());
            txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
            txtSuperficieConstruida.setText("" + caracteristicasActual.obtenerTerrenoConstruido());

        }
    }

    private void obtenerDesarrollos() {

        cboDesarrollo.removeAllItems();

        List<Desarrollo> resultadoDesarrollos;
        resultadoDesarrollos = (new ConsultaDesarrollos()).consultarDesarrollos();

        for (int x = 0; x < resultadoDesarrollos.size(); x++) {
            cboDesarrollo.addItem(resultadoDesarrollos.get(x).obtenerNombre());
        }
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        txtColonia = new javax.swing.JTextField();
        lblReferencias = new javax.swing.JLabel();
        txtDireccion = new javax.swing.JTextField();
        lblColonia = new javax.swing.JLabel();
        txtReferencias = new javax.swing.JTextField();
        lblDireccion = new javax.swing.JLabel();
        lblNombreClave = new javax.swing.JLabel();
        txtNombreClave = new javax.swing.JTextField();
        jPanel2 = new javax.swing.JPanel();
        lblNoRecamaras = new javax.swing.JLabel();
        txtNoRecamaras = new com.toedter.components.JSpinField();
        lblNiveles = new javax.swing.JLabel();
        txtNiveles = new com.toedter.components.JSpinField();
        lblPrecio = new javax.swing.JLabel();
        txtPrecio = new javax.swing.JTextField();
        lblSimbolo = new javax.swing.JLabel();
        lblTerreno = new javax.swing.JLabel();
        txtTerreno = new javax.swing.JTextField();
        lblMetros = new javax.swing.JLabel();
        lblSuperficieConstruida = new javax.swing.JLabel();
        cboTipo = new javax.swing.JComboBox();
        lblTipo = new javax.swing.JLabel();
        txtSuperficieConstruida = new javax.swing.JTextField();
        lblMetros2 = new javax.swing.JLabel();
        cmdNuevo = new javax.swing.JButton();
        cmdGuardar = new javax.swing.JButton();
        cmdEliminar = new javax.swing.JButton();
        cmdCancelar = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        cmdPrimero = new javax.swing.JButton();
        cmdAnterior = new javax.swing.JButton();
        txtIndiceActual = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        lblTotal = new javax.swing.JLabel();
        cmdSiguiente = new javax.swing.JButton();
        cmdUltimo = new javax.swing.JButton();
        lblDescripcion = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        txtDescripcion = new javax.swing.JTextArea();
        lblDesarrollo = new javax.swing.JLabel();
        cboDesarrollo = new javax.swing.JComboBox();
        chkVendido = new javax.swing.JCheckBox();
        cmdBuscar = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        tablaResultados = new javax.swing.JTable();
        jSeparator2 = new javax.swing.JSeparator();
        txtFecha = new com.toedter.calendar.JCalendar();
        lblCliente = new javax.swing.JLabel();
        cboCliente = new javax.swing.JComboBox();
        jScrollPane3 = new javax.swing.JScrollPane();
        txtObservaciones = new javax.swing.JTextArea();
        lblObservaciones = new javax.swing.JLabel();
        panelFiltro = new javax.swing.JPanel();
        txtFiltro = new javax.swing.JTextField();
        cmdAgregarVisita = new javax.swing.JButton();
        cmdEditar = new javax.swing.JButton();
        cmdEliminarVisita = new javax.swing.JButton();
        cmdBuscarCliente = new javax.swing.JButton();
        chkEsVenta = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Inmuebles");
        setResizable(false);

        lblReferencias.setText("Referencias");

        lblColonia.setText("Colonia");

        lblDireccion.setText("Dirección");

        lblNombreClave.setText("Nombre clave");

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Características"));

        lblNoRecamaras.setText("No. Recamaras");

        lblNiveles.setText("Níveles");

        lblPrecio.setFont(new java.awt.Font("Ubuntu", 3, 18)); // NOI18N
        lblPrecio.setText("Precio");

        txtPrecio.setFont(new java.awt.Font("Ubuntu", 2, 14)); // NOI18N
        txtPrecio.setText("0");
        txtPrecio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtPrecioActionPerformed(evt);
            }
        });

        lblSimbolo.setFont(new java.awt.Font("Ubuntu", 2, 14)); // NOI18N
        lblSimbolo.setText("$");

        lblTerreno.setText("Terreno");

        txtTerreno.setText("0");

        lblMetros.setText("m²");

        lblSuperficieConstruida.setText("Superficie construida");

        cboTipo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Casa", "Departamento", "Terreno", "Local" }));

        lblTipo.setText("Tipo");

        txtSuperficieConstruida.setText("0");
        txtSuperficieConstruida.setToolTipText("");

        lblMetros2.setText("m²");

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblNoRecamaras)
                    .addComponent(lblNiveles, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(lblTerreno, javax.swing.GroupLayout.Alignment.TRAILING))
                .addGap(18, 18, 18)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(txtTerreno)
                    .addComponent(txtNoRecamaras, javax.swing.GroupLayout.DEFAULT_SIZE, 77, Short.MAX_VALUE)
                    .addComponent(txtNiveles, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(lblMetros)
                        .addGap(18, 18, 18)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lblSuperficieConstruida)
                            .addComponent(lblTipo, javax.swing.GroupLayout.Alignment.TRAILING)))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(lblPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, 61, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblSimbolo)))
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGap(16, 16, 16)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtSuperficieConstruida, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(cboTipo, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(3, 3, 3)
                        .addComponent(lblMetros2))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(txtPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(258, Short.MAX_VALUE))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(13, 13, 13)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(txtNoRecamaras, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNoRecamaras))
                        .addGap(26, 26, 26)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(txtNiveles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNiveles)))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(lblSimbolo)
                                .addComponent(lblPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(txtPrecio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(20, 20, 20)
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(cboTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblTipo))))
                .addGap(18, 18, 18)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtTerreno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblMetros)
                        .addComponent(lblSuperficieConstruida)
                        .addComponent(lblTerreno))
                    .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtSuperficieConstruida, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(lblMetros2)))
                .addContainerGap(14, Short.MAX_VALUE))
        );

        cmdNuevo.setFont(new java.awt.Font("Ubuntu", 2, 15)); // NOI18N
        cmdNuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Nuevo.png"))); // NOI18N
        cmdNuevo.setMnemonic('n');
        cmdNuevo.setText("Nuevo");
        cmdNuevo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdNuevoActionPerformed(evt);
            }
        });

        cmdGuardar.setFont(new java.awt.Font("Ubuntu", 2, 15)); // NOI18N
        cmdGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Guardar.png"))); // NOI18N
        cmdGuardar.setMnemonic('g');
        cmdGuardar.setText("Guardar");
        cmdGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdGuardarActionPerformed(evt);
            }
        });

        cmdEliminar.setFont(new java.awt.Font("Ubuntu", 2, 15)); // NOI18N
        cmdEliminar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Borrar.png"))); // NOI18N
        cmdEliminar.setMnemonic('e');
        cmdEliminar.setText("Eliminar");
        cmdEliminar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdEliminarActionPerformed(evt);
            }
        });

        cmdCancelar.setFont(new java.awt.Font("Ubuntu", 2, 15)); // NOI18N
        cmdCancelar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Cancelar.png"))); // NOI18N
        cmdCancelar.setMnemonic('c');
        cmdCancelar.setText("Cancelar");
        cmdCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdCancelarActionPerformed(evt);
            }
        });

        cmdPrimero.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/First.png"))); // NOI18N
        cmdPrimero.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdPrimeroActionPerformed(evt);
            }
        });

        cmdAnterior.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Back.png"))); // NOI18N
        cmdAnterior.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdAnteriorActionPerformed(evt);
            }
        });

        txtIndiceActual.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtIndiceActualActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Ubuntu", 0, 18)); // NOI18N
        jLabel1.setText("/");

        lblTotal.setFont(new java.awt.Font("Ubuntu", 0, 24)); // NOI18N
        lblTotal.setText("100");

        cmdSiguiente.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Forward.png"))); // NOI18N
        cmdSiguiente.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdSiguienteActionPerformed(evt);
            }
        });

        cmdUltimo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Last.png"))); // NOI18N
        cmdUltimo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdUltimoActionPerformed(evt);
            }
        });

        lblDescripcion.setText("Descripción");

        txtDescripcion.setColumns(20);
        txtDescripcion.setRows(5);
        jScrollPane1.setViewportView(txtDescripcion);

        lblDesarrollo.setText("Desarrollo EGGO");

        cboDesarrollo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        chkVendido.setText("Vendido");

        cmdBuscar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Busca.png"))); // NOI18N
        cmdBuscar.setText("Buscar");
        cmdBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdBuscarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.TRAILING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(cmdNuevo)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(cmdGuardar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(cmdEliminar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(cmdCancelar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cmdPrimero)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmdAnterior)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtIndiceActual, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel1)
                        .addGap(9, 9, 9)
                        .addComponent(lblTotal)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmdSiguiente)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmdUltimo)
                        .addGap(58, 58, 58))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGap(21, 21, 21)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(lblDireccion)
                                    .addComponent(lblNombreClave)
                                    .addComponent(lblColonia)
                                    .addComponent(lblReferencias))
                                .addGap(18, 18, 18)
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(txtColonia, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(txtDireccion, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGroup(jPanel1Layout.createSequentialGroup()
                                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                            .addGroup(jPanel1Layout.createSequentialGroup()
                                                .addComponent(txtNombreClave, javax.swing.GroupLayout.PREFERRED_SIZE, 154, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(191, 191, 191)
                                                .addComponent(lblDescripcion))
                                            .addGroup(jPanel1Layout.createSequentialGroup()
                                                .addComponent(txtReferencias, javax.swing.GroupLayout.PREFERRED_SIZE, 232, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addComponent(lblDesarrollo)))
                                        .addGap(18, 18, 18)
                                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                            .addGroup(jPanel1Layout.createSequentialGroup()
                                                .addComponent(cboDesarrollo, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGap(46, 46, 46)
                                                .addComponent(chkVendido))
                                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 396, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(cmdBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(0, 80, Short.MAX_VALUE))))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(21, 21, 21)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtNombreClave, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblNombreClave))
                        .addGap(18, 18, 18)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtDireccion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblDireccion))
                        .addGap(18, 18, 18)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(txtColonia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblColonia)))
                    .addComponent(lblDescripcion)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(25, 25, 25)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(lblReferencias)
                            .addComponent(txtReferencias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(cboDesarrollo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(lblDesarrollo)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(chkVendido)))
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(48, 48, 48)
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(122, 122, 122)
                        .addComponent(cmdBuscar, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 120, Short.MAX_VALUE)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(cmdEliminar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cmdGuardar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cmdCancelar, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(cmdNuevo))
                    .addComponent(txtIndiceActual, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(cmdAnterior, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                        .addComponent(cmdPrimero, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(lblTotal, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(cmdUltimo, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                            .addComponent(cmdSiguiente, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(2, 2, 2)))
                .addContainerGap())
        );

        jTabbedPane1.addTab("Datos", jPanel1);

        tablaResultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaResultados.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaResultadosMouseClicked(evt);
            }
        });
        jScrollPane2.setViewportView(tablaResultados);

        jSeparator2.setOrientation(javax.swing.SwingConstants.VERTICAL);

        lblCliente.setText("Cliente");

        txtObservaciones.setColumns(20);
        txtObservaciones.setRows(5);
        jScrollPane3.setViewportView(txtObservaciones);

        lblObservaciones.setText("Observaciones");

        panelFiltro.setBorder(javax.swing.BorderFactory.createTitledBorder("Filtro"));

        txtFiltro.setFont(new java.awt.Font("Ubuntu", 2, 18)); // NOI18N

        javax.swing.GroupLayout panelFiltroLayout = new javax.swing.GroupLayout(panelFiltro);
        panelFiltro.setLayout(panelFiltroLayout);
        panelFiltroLayout.setHorizontalGroup(
            panelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelFiltroLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(txtFiltro)
                .addContainerGap())
        );
        panelFiltroLayout.setVerticalGroup(
            panelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelFiltroLayout.createSequentialGroup()
                .addContainerGap(49, Short.MAX_VALUE)
                .addComponent(txtFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, 44, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(24, 24, 24))
        );

        cmdAgregarVisita.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Nuevo.png"))); // NOI18N
        cmdAgregarVisita.setToolTipText("Agregar visita");
        cmdAgregarVisita.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdAgregarVisitaActionPerformed(evt);
            }
        });

        cmdEditar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Aceptar.png"))); // NOI18N
        cmdEditar.setToolTipText("Editar visita");
        cmdEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdEditarActionPerformed(evt);
            }
        });

        cmdEliminarVisita.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Borrar.png"))); // NOI18N
        cmdEliminarVisita.setToolTipText("Borrar visita");
        cmdEliminarVisita.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdEliminarVisitaActionPerformed(evt);
            }
        });

        cmdBuscarCliente.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Imagenes/Busca.png"))); // NOI18N

        chkEsVenta.setText("Es venta");

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelFiltro, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 735, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(lblObservaciones)
                            .addComponent(jScrollPane3)
                            .addComponent(txtFecha, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(jPanel3Layout.createSequentialGroup()
                                .addComponent(lblCliente)
                                .addGap(18, 18, 18)
                                .addComponent(cboCliente, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(cmdBuscarCliente, javax.swing.GroupLayout.DEFAULT_SIZE, 57, Short.MAX_VALUE))))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(59, 59, 59)
                        .addComponent(cmdAgregarVisita)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmdEditar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(cmdEliminarVisita))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(chkEsVenta)))
                .addGap(27, 27, 27))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jSeparator2))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(27, 27, 27)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 354, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(panelFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblCliente)
                    .addComponent(cboCliente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cmdBuscarCliente))
                .addGap(18, 18, 18)
                .addComponent(txtFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(lblObservaciones)
                .addGap(10, 10, 10)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(chkEsVenta)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 20, Short.MAX_VALUE)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(cmdAgregarVisita, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(cmdEditar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(cmdEliminarVisita))
                .addGap(49, 49, 49))
        );

        jTabbedPane1.addTab("Visitas", jPanel3);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 1123, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jTabbedPane1)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void cmdGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdGuardarActionPerformed

        cmdGuardar.setEnabled(true);
        cmdCancelar.setEnabled(true);

        int resultado = 0;
        int resultado2 = 0;
        String mensaje = "";
        String strPrecio = txtPrecio.getText();
        boolean valido = ValidaNumeros.validarNumeroDoble(strPrecio);
        String strTerreno = txtTerreno.getText();
        boolean valido2 = ValidaNumeros.validarNumeroFlotante(strTerreno);
        String strConstruido = txtSuperficieConstruida.getText();
        boolean valido3 = ValidaNumeros.validarNumeroFlotante(strConstruido);

        if (valido && valido2 && valido3) {

            if (desarrollo) {

                int idDes = (new ConsultaDesarrollos()).obtenerIdDesarrollo(cboDesarrollo.getSelectedItem().toString());

                if (nuevoProducto) {

                    resultado = consultaProductos.agregarNuevoDesarrollo(idDes,
                            txtNombreClave.getText(), cboTipo.getSelectedItem().toString(),
                            chkVendido.isSelected(), desarrollo);
                    mensaje = "Inmueble agregado";

                } else {

                    resultado = consultaProductos.actualizarProductoDesarrollo(idDes,
                            txtNombreClave.getText(), cboTipo.getSelectedItem().toString(),
                            chkVendido.isSelected(), idProducto);
                    mensaje = "Inmueble actualizado";

                }

            } else {

                if (nuevoProducto) {

                    resultado = consultaProductos.agregarNuevoCorretaje(txtNombreClave.getText(),
                            txtDireccion.getText(), txtColonia.getText(), txtReferencias.getText(),
                            cboTipo.getSelectedItem().toString(), chkVendido.isSelected(), desarrollo);
                    mensaje = "Inmueble agregado";

                } else {

                    resultado = consultaProductos.actualizarProducto(txtNombreClave.getText(),
                            txtDireccion.getText(), txtColonia.getText(),
                            txtReferencias.getText(), cboTipo.getSelectedItem().toString(),
                            chkVendido.isSelected(), idProducto);
                    mensaje = "Mobiliario actualizado";

                }
            }

            if (nuevoProducto) {

                int ultimoIdProducto = consultaProductos.obtenerIdUltimoRegistro();

                resultado2 = consultaCaracteristicasProducto.agregarCaracteristicasProducto(ultimoIdProducto,
                        Byte.parseByte(String.valueOf(txtNoRecamaras.getValue())),
                        Byte.parseByte(String.valueOf((txtNiveles.getValue()))),
                        Double.parseDouble(txtPrecio.getText()), Float.parseFloat(txtTerreno.getText()),
                        txtDescripcion.getText(), Float.parseFloat(txtSuperficieConstruida.getText()));
            } else {

                resultado2 = consultaCaracteristicasProducto.actualizarCaracteristicasProducto(
                        idProducto, Byte.parseByte(String.valueOf(txtNoRecamaras.getValue())),
                        Byte.parseByte(String.valueOf((txtNiveles.getValue()))),
                        Double.parseDouble(txtPrecio.getText()),
                        Float.parseFloat(txtTerreno.getText()), txtDescripcion.getText(),
                        Float.parseFloat(txtSuperficieConstruida.getText()),
                        idCaracteristicasProducto);
            }

            if (resultado == 1 && resultado2 == 1) {
                JOptionPane.showMessageDialog(null, mensaje,
                        "Inmuebles", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                        "Inmuebles", JOptionPane.ERROR_MESSAGE);
            }

        } else {
            JOptionPane.showMessageDialog(null, "Cantidad no válida",
                    "Inmuebles", JOptionPane.WARNING_MESSAGE);
        }

        nuevoProducto = false;

        if (desarrollo) {
            explorarDesarrollo();
        } else {
            explorarCorretaje();
        }

        explorarCaracteristicasProducto();

        cmdNuevo.setEnabled(true);
        cmdEliminar.setEnabled(true);
    }//GEN-LAST:event_cmdGuardarActionPerformed

    private void cmdNuevoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdNuevoActionPerformed
        cmdGuardar.setEnabled(true);
        cmdCancelar.setEnabled(true);
        cmdEliminar.setEnabled(false);

        nuevoProducto = true;
        txtNombreClave.setText("");
        cboTipo.setSelectedIndex(0);
        chkVendido.setSelected(false);
        txtNoRecamaras.setValue(0);
        txtNiveles.setValue(0);
        txtPrecio.setText("");
        txtTerreno.setText("");
        txtDescripcion.setText("");
        txtSuperficieConstruida.setText("");

        if (desarrollo) {
            cboTipo.setSelectedIndex(0);
        } else {
            txtDireccion.setText("");
            txtColonia.setText("");
            txtReferencias.setText("");
        }
    }//GEN-LAST:event_cmdNuevoActionPerformed

    private void txtPrecioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPrecioActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtPrecioActionPerformed

    private void txtIndiceActualActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtIndiceActualActionPerformed

        String str = txtIndiceActual.getText();

        if (ValidaNumeros.validarNumeroEntero(str)) {

            indiceActual = (Integer.parseInt(str) - 1);

            indiceActualCaracteristicas = (Integer.parseInt(str) - 1);

            if (numeroProductos != 0 && indiceActual < numeroProductos
                    && numeroCaracteristicasProducto != 0
                    && indiceActualCaracteristicas < numeroCaracteristicasProducto) {

                if (desarrollo) {
                    desarrolloActual = resultadosProductosDesarrollo.get(indiceActual);
                    idProducto = desarrolloActual.obtenerIdProducto();
                    txtNombreClave.setText(desarrolloActual.obtenerNombre());
                    cboTipo.setSelectedItem(desarrolloActual.obtenerTipo().toString());
                    cboDesarrollo.setSelectedItem(desarrolloActual.obtenerDesarrollo());
                    chkVendido.setSelected(desarrolloActual.obtenerVendido());

                } else {
                    corretajeActual = resultadosCorretaje.get(indiceActual);
                    idProducto = corretajeActual.obtenerIdProducto();
                    txtNombreClave.setText(corretajeActual.obtenerNombre());
                    txtDireccion.setText(corretajeActual.obtenerDireccion());
                    txtColonia.setText(corretajeActual.obtenerColonia());
                    txtReferencias.setText(corretajeActual.obtenerReferencias());
                    cboTipo.setSelectedItem(corretajeActual.obtenerTipo().toString());
                    chkVendido.setSelected(corretajeActual.obtenerVendido());
                }

                caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);
                idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();
                txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
                txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
                txtPrecio.setText(String.valueOf(caracteristicasActual.obtenerPrecio()));
                txtTerreno.setText(String.valueOf(caracteristicasActual.obtenerTerreno()));
                txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
                txtSuperficieConstruida.setText(String.valueOf(caracteristicasActual.obtenerTerrenoConstruido()));

                mostrarVisitasEnTabla();
            }

        } else {

            JOptionPane.showMessageDialog(null, "Ingresa un número válido",
                    "Inmuebles", JOptionPane.ERROR_MESSAGE);

            if (desarrollo) {
                explorarDesarrollo();
            } else {
                explorarCorretaje();
            }

            explorarCaracteristicasProducto();
        }
    }//GEN-LAST:event_txtIndiceActualActionPerformed

    private void mostrarVisitasEnTabla() {
        try {
            modeloTabla.realizarConsulta(idProducto);
            acomodarColumnas();
        } catch (SQLException ex) {
            modeloTabla.desconectarDeBaseDeDatos();
            ex.printStackTrace();
            System.exit(1);
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }
    }
    private void cmdPrimeroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdPrimeroActionPerformed
        indiceActual = 0;
        txtIndiceActual.setText("" + (indiceActual + 1));
        txtIndiceActualActionPerformed(evt);
    }//GEN-LAST:event_cmdPrimeroActionPerformed

    private void cmdAnteriorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdAnteriorActionPerformed
        indiceActual--;

        if (indiceActual < 0) {
            indiceActual = numeroProductos - 1;
        }

        txtIndiceActual.setText("" + (indiceActual + 1));
        txtIndiceActualActionPerformed(evt);
    }//GEN-LAST:event_cmdAnteriorActionPerformed

    private void cmdSiguienteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdSiguienteActionPerformed
        indiceActual++;

        if (indiceActual >= numeroProductos) {
            indiceActual = 0;
        }

        txtIndiceActual.setText("" + (indiceActual + 1));
        txtIndiceActualActionPerformed(evt);
    }//GEN-LAST:event_cmdSiguienteActionPerformed

    private void cmdUltimoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdUltimoActionPerformed
        indiceActual = numeroProductos - 1;

        txtIndiceActual.setText("" + (indiceActual + 1));

        txtIndiceActualActionPerformed(evt);
    }//GEN-LAST:event_cmdUltimoActionPerformed

    private void cmdCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdCancelarActionPerformed
        nuevoProducto = false;
        if (desarrollo) {
            explorarDesarrollo();
        } else {
            explorarCorretaje();
        }
        explorarCaracteristicasProducto();
        cmdNuevo.setEnabled(true);
        cmdGuardar.setEnabled(true);
        cmdCancelar.setEnabled(true);
        cmdEliminar.setEnabled(true);
    }//GEN-LAST:event_cmdCancelarActionPerformed

    private void cmdEliminarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdEliminarActionPerformed
        int resultado = 0;
        int resultado2 = 0;

        int opc = JOptionPane.showConfirmDialog(this, "¿Seguro que deseas eliminar este Inmueble?",
                "Inmuebles", JOptionPane.YES_NO_OPTION);

        if (opc == JOptionPane.YES_OPTION) {

            resultado2 = consultaCaracteristicasProducto.eliminarCaracteristicasProducto(idCaracteristicasProducto);

            resultado = consultaProductos.eliminarProducto(idProducto);

            if (resultado != 0 && resultado2 != 0) {

                JOptionPane.showMessageDialog(null, "Inmueble eliminado",
                        "Inmuebles", JOptionPane.INFORMATION_MESSAGE);

                if (desarrollo) {
                    explorarDesarrollo();
                } else {
                    explorarCorretaje();
                }

                explorarCaracteristicasProducto();

            } else {
                JOptionPane.showMessageDialog(null, "No se pudo eliminar Inmueble",
                        "Inmuebles", JOptionPane.INFORMATION_MESSAGE);
            }
        }

        cmdNuevo.setEnabled(true);
        cmdGuardar.setEnabled(true);
        cmdCancelar.setEnabled(true);
        cmdEliminar.setEnabled(true);
    }//GEN-LAST:event_cmdEliminarActionPerformed

    private void cmdBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdBuscarActionPerformed

        javax.swing.ButtonGroup buttonGroup1 = new javax.swing.ButtonGroup();
        javax.swing.JRadioButton optNombre = new javax.swing.JRadioButton("Nombre", true);
        javax.swing.JRadioButton optColonia = new javax.swing.JRadioButton("Colonia", false);
        javax.swing.JRadioButton optDesarrollo = new javax.swing.JRadioButton("Desarrollo", false);
        javax.swing.JRadioButton optTipo = new javax.swing.JRadioButton("Tipo", false);
        javax.swing.JComboBox cboTipoBuscar = new javax.swing.JComboBox();

        cboTipoBuscar.addItem("Casa");
        cboTipoBuscar.addItem("Departamento");
        cboTipoBuscar.addItem("Terreno");
        cboTipoBuscar.addItem("Local");

        buttonGroup1.add(optNombre);
        buttonGroup1.add(optColonia);
        buttonGroup1.add(optDesarrollo);
        buttonGroup1.add(optTipo);
        javax.swing.JTextField txtParametro = new javax.swing.JTextField();

        if (desarrollo) {
            optNombre.setText("Modelo");
            Object[] controles = {"Buscar por", optNombre, optDesarrollo, optTipo,
                txtParametro, "Tipo", cboTipoBuscar};
            int sel = JOptionPane.showConfirmDialog(null, controles,
                    "Buscar cliente", JOptionPane.OK_CANCEL_OPTION);

            if (sel == JOptionPane.OK_OPTION) {
                if (optNombre.isSelected()) {
                    buscarDesarrolloNombre(txtParametro.getText());
                    buscarCaracteristicasNombre(txtParametro.getText());
                } else if (optDesarrollo.isSelected()) {
                    buscarPorDesarrollo(txtParametro.getText());
                    buscarCaracteristicasDesarrollo(txtParametro.getText());
                } else if (optTipo.isSelected()) {
                    buscarDesarrolloTipo(cboTipoBuscar.getSelectedItem().toString());
                    buscarCaracteristicasTipo(cboTipoBuscar.getSelectedItem().toString());
                }
            }
        } else {
            Object[] controles = {"Buscar por", optNombre, optColonia, optTipo,
                txtParametro, "Tipo", cboTipoBuscar};
            int sel = JOptionPane.showConfirmDialog(null, controles,
                    "Buscar cliente", JOptionPane.OK_CANCEL_OPTION);
            if (sel == JOptionPane.OK_OPTION) {
                if (optNombre.isSelected()) {
                    buscarCorretajeNombre(txtParametro.getText());
                    buscarCaracteristicasNombre(txtParametro.getText());
                } else if (optColonia.isSelected()) {
                    buscarCorretajeColonia(txtParametro.getText());
                    buscarCaracteristicasColonia(txtParametro.getText());
                } else if (optTipo.isSelected()) {
                    buscarCorretajeTipo(cboTipoBuscar.getSelectedItem().toString());
                    buscarCaracteristicasTipo(cboTipoBuscar.getSelectedItem().toString());
                }
            }
        }


    }//GEN-LAST:event_cmdBuscarActionPerformed

    private void cmdAgregarVisitaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdAgregarVisitaActionPerformed

        txtFiltro.setText("");
        sorter.setRowFilter(null);

        int resultado = consultaVisitas.insertarVisita(consultaVisitas.obtenerIdCliente(
                cboCliente.getSelectedItem().toString()), idProducto,
                new java.sql.Date(txtFecha.getDate().getTime()),
                txtObservaciones.getText(), chkEsVenta.isSelected());

        if (resultado == 1) {
            JOptionPane.showMessageDialog(null, "Visita agregada",
                    "Inmueble", JOptionPane.INFORMATION_MESSAGE);

            int resultado2 = consultaProductos.venderInmobil(idProducto, chkEsVenta.isSelected());

            if (resultado2 == 0) {
                JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                        "Inmueble", JOptionPane.ERROR_MESSAGE);
            } else {
                cmdCancelarActionPerformed(null);
            }

        } else {
            JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                    "Inmueble", JOptionPane.ERROR_MESSAGE);
        }

        mostrarVisitasEnTabla();
    }//GEN-LAST:event_cmdAgregarVisitaActionPerformed

    private void cmdEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdEditarActionPerformed
        txtFiltro.setText("");
        sorter.setRowFilter(null);
        int idClienteXProducto = obtenerIdVisita();

        if (idClienteXProducto > 0) {

            int resultado = consultaVisitas.actualizarVisita(consultaVisitas.obtenerIdCliente(
                    cboCliente.getSelectedItem().toString()), idProducto,
                    new java.sql.Date(txtFecha.getDate().getTime()),
                    txtObservaciones.getText(), chkEsVenta.isSelected(), idClienteXProducto);

            if (resultado == 1) {
                JOptionPane.showMessageDialog(null, "Visita modificada",
                        "Inmueble", JOptionPane.INFORMATION_MESSAGE);

                int resultado2 = consultaProductos.venderInmobil(idProducto, chkEsVenta.isSelected());

                if (resultado2 == 0) {
                    JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                            "Inmueble", JOptionPane.ERROR_MESSAGE);
                } else {
                    cmdCancelarActionPerformed(null);
                }

            } else {
                JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                        "Inmueble", JOptionPane.ERROR_MESSAGE);
            }
        }

        mostrarVisitasEnTabla();
    }//GEN-LAST:event_cmdEditarActionPerformed

    private void tablaResultadosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaResultadosMouseClicked

        txtFiltro.setText("");
        sorter.setRowFilter(null);

        int filaSeleccionada = tablaResultados.getSelectedRow();
        SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
        Date fechaVisita = null;

        try {
            fechaVisita = formatoFecha.parse(modeloTabla.getValueAt(filaSeleccionada, 3).toString());
        } catch (ParseException ex) {
            ex.printStackTrace();
            JOptionPane.showMessageDialog(null, "Error al convertir la fecha",
                    "Visitas", JOptionPane.ERROR_MESSAGE);
            modeloTabla.desconectarDeBaseDeDatos();
            System.exit(1);
        }

        cboCliente.setSelectedItem(modeloTabla.getValueAt(filaSeleccionada, 1).toString());
        txtFecha.setDate(fechaVisita);
        txtObservaciones.setText(modeloTabla.getValueAt(filaSeleccionada, 4).toString());
        chkEsVenta.setSelected(Boolean.parseBoolean(modeloTabla.getValueAt(filaSeleccionada, 5).toString()));

    }//GEN-LAST:event_tablaResultadosMouseClicked

    private void cmdEliminarVisitaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmdEliminarVisitaActionPerformed
        txtFiltro.setText("");
        sorter.setRowFilter(null);
        int idClienteXProducto = obtenerIdVisita();

        if (idClienteXProducto > 0) {

            int resultado = consultaVisitas.eliminarVisita(idClienteXProducto);

            if (resultado == 1) {
                JOptionPane.showMessageDialog(null, "Visita eliminada",
                        "Visitas", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "No se pudo realizar la operación",
                        "Visitas", JOptionPane.ERROR_MESSAGE);
            }
        }

        mostrarVisitasEnTabla();
    }//GEN-LAST:event_cmdEliminarVisitaActionPerformed

    private int obtenerIdVisita() {
        int idVisita = 0;
        int filaSeleccionada = tablaResultados.getSelectedRow();

        try {

            idVisita = Integer.parseInt(modeloTabla.getValueAt(filaSeleccionada, 0).toString());

        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, "Debe seleccionarse un registro",
                    "Visitas", JOptionPane.WARNING_MESSAGE);
        }

        return idVisita;
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JComboBox cboCliente;
    private javax.swing.JComboBox cboDesarrollo;
    private javax.swing.JComboBox cboTipo;
    private javax.swing.JCheckBox chkEsVenta;
    private javax.swing.JCheckBox chkVendido;
    private javax.swing.JButton cmdAgregarVisita;
    private javax.swing.JButton cmdAnterior;
    private javax.swing.JButton cmdBuscar;
    private javax.swing.JButton cmdBuscarCliente;
    private javax.swing.JButton cmdCancelar;
    private javax.swing.JButton cmdEditar;
    private javax.swing.JButton cmdEliminar;
    private javax.swing.JButton cmdEliminarVisita;
    private javax.swing.JButton cmdGuardar;
    private javax.swing.JButton cmdNuevo;
    private javax.swing.JButton cmdPrimero;
    private javax.swing.JButton cmdSiguiente;
    private javax.swing.JButton cmdUltimo;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JLabel lblCliente;
    private javax.swing.JLabel lblColonia;
    private javax.swing.JLabel lblDesarrollo;
    private javax.swing.JLabel lblDescripcion;
    private javax.swing.JLabel lblDireccion;
    private javax.swing.JLabel lblMetros;
    private javax.swing.JLabel lblMetros2;
    private javax.swing.JLabel lblNiveles;
    private javax.swing.JLabel lblNoRecamaras;
    private javax.swing.JLabel lblNombreClave;
    private javax.swing.JLabel lblObservaciones;
    private javax.swing.JLabel lblPrecio;
    private javax.swing.JLabel lblReferencias;
    private javax.swing.JLabel lblSimbolo;
    private javax.swing.JLabel lblSuperficieConstruida;
    private javax.swing.JLabel lblTerreno;
    private javax.swing.JLabel lblTipo;
    private javax.swing.JLabel lblTotal;
    private javax.swing.JPanel panelFiltro;
    private javax.swing.JTable tablaResultados;
    private javax.swing.JTextField txtColonia;
    private javax.swing.JTextArea txtDescripcion;
    private javax.swing.JTextField txtDireccion;
    private com.toedter.calendar.JCalendar txtFecha;
    private javax.swing.JTextField txtFiltro;
    private javax.swing.JTextField txtIndiceActual;
    private com.toedter.components.JSpinField txtNiveles;
    private com.toedter.components.JSpinField txtNoRecamaras;
    private javax.swing.JTextField txtNombreClave;
    private javax.swing.JTextArea txtObservaciones;
    private javax.swing.JTextField txtPrecio;
    private javax.swing.JTextField txtReferencias;
    private javax.swing.JTextField txtSuperficieConstruida;
    private javax.swing.JTextField txtTerreno;
    // End of variables declaration//GEN-END:variables

    private void buscarDesarrolloNombre(String nombre) {
        resultadosProductosDesarrollo = consultaProductos.buscarProductoNombreDesarrollo(nombre);
        numeroProductos = resultadosProductosDesarrollo.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            desarrolloActual = resultadosProductosDesarrollo.get(indiceActual);
            idProducto = desarrolloActual.obtenerIdProducto();
            txtNombreClave.setText(desarrolloActual.obtenerNombre());
            cboTipo.setSelectedItem(desarrolloActual.obtenerTipo());
            cboDesarrollo.setSelectedItem(desarrolloActual.obtenerDesarrollo());
            chkVendido.setSelected(desarrolloActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();
        }
    }

    private void buscarPorDesarrollo(String desarrollo) {
        resultadosProductosDesarrollo = consultaProductos.buscarProductoDesarrollo(desarrollo);
        numeroProductos = resultadosProductosDesarrollo.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            desarrolloActual = resultadosProductosDesarrollo.get(indiceActual);
            idProducto = desarrolloActual.obtenerIdProducto();
            txtNombreClave.setText(desarrolloActual.obtenerNombre());
            cboTipo.setSelectedItem(desarrolloActual.obtenerTipo());
            cboDesarrollo.setSelectedItem(desarrolloActual.obtenerDesarrollo());
            chkVendido.setSelected(desarrolloActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();

        }
    }

    private void buscarDesarrolloTipo(String tipo) {
        resultadosProductosDesarrollo = consultaProductos.buscarDesarrolloTipo(tipo);
        numeroProductos = resultadosProductosDesarrollo.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            desarrolloActual = resultadosProductosDesarrollo.get(indiceActual);
            idProducto = desarrolloActual.obtenerIdProducto();
            txtNombreClave.setText(desarrolloActual.obtenerNombre());
            cboTipo.setSelectedItem(desarrolloActual.obtenerTipo());
            cboDesarrollo.setSelectedItem(desarrolloActual.obtenerDesarrollo());
            chkVendido.setSelected(desarrolloActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();

        }
    }

    private void buscarCaracteristicasNombre(String nombre) {
        resultadosCaracteristicasProducto = consultaCaracteristicasProducto.buscarCaracteristicasNombre(desarrollo, nombre);
        numeroCaracteristicasProducto = resultadosCaracteristicasProducto.size();

        if (numeroCaracteristicasProducto != 0) {

            indiceActualCaracteristicas = 0;
            caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);

            idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();

            txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
            txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
            txtPrecio.setText("" + caracteristicasActual.obtenerPrecio());
            txtTerreno.setText("" + caracteristicasActual.obtenerTerreno());
            txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
            txtSuperficieConstruida.setText("" + caracteristicasActual.obtenerTerrenoConstruido());
            mostrarVisitasEnTabla();

        } else {
            JOptionPane.showMessageDialog(null, "No se encontraron resultados",
                    "Búsqueda", JOptionPane.INFORMATION_MESSAGE);
            cmdCancelarActionPerformed(null);
        }
    }

    private void buscarCaracteristicasTipo(String tipo) {
        resultadosCaracteristicasProducto = consultaCaracteristicasProducto.buscarCaracteristicasCorretajeTipo(desarrollo, tipo);
        numeroCaracteristicasProducto = resultadosCaracteristicasProducto.size();

        if (numeroCaracteristicasProducto != 0) {

            indiceActualCaracteristicas = 0;
            caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);

            idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();

            txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
            txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
            txtPrecio.setText("" + caracteristicasActual.obtenerPrecio());
            txtTerreno.setText("" + caracteristicasActual.obtenerTerreno());
            txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
            txtSuperficieConstruida.setText("" + caracteristicasActual.obtenerTerrenoConstruido());
            mostrarVisitasEnTabla();

        } else {
            JOptionPane.showMessageDialog(null, "No se encontraron resultados",
                    "Búsqueda", JOptionPane.INFORMATION_MESSAGE);
            cmdCancelarActionPerformed(null);
        }
    }

    private void buscarCaracteristicasDesarrollo(String desarrollo) {
        resultadosCaracteristicasProducto = consultaCaracteristicasProducto.buscarCaracteristicasDesarrollo(desarrollo);
        numeroCaracteristicasProducto = resultadosCaracteristicasProducto.size();

        if (numeroCaracteristicasProducto != 0) {

            indiceActualCaracteristicas = 0;
            caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);

            idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();

            txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
            txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
            txtPrecio.setText("" + caracteristicasActual.obtenerPrecio());
            txtTerreno.setText("" + caracteristicasActual.obtenerTerreno());
            txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
            txtSuperficieConstruida.setText("" + caracteristicasActual.obtenerTerrenoConstruido());
            mostrarVisitasEnTabla();

        } else {
            JOptionPane.showMessageDialog(null, "No se encontraron resultados",
                    "Búsqueda", JOptionPane.INFORMATION_MESSAGE);
            cmdCancelarActionPerformed(null);
        }
    }

    private void buscarCorretajeNombre(String nombre) {
        resultadosCorretaje = consultaProductos.buscarProductoNombreCorretaje(nombre);
        numeroProductos = resultadosCorretaje.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            corretajeActual = resultadosCorretaje.get(indiceActual);

            idProducto = corretajeActual.obtenerIdProducto();
            txtNombreClave.setText(corretajeActual.obtenerNombre());
            txtDireccion.setText(corretajeActual.obtenerDireccion());
            txtColonia.setText(corretajeActual.obtenerColonia());
            txtReferencias.setText(corretajeActual.obtenerReferencias());
            cboTipo.setSelectedItem(corretajeActual.obtenerTipo().toString());
            chkVendido.setSelected(corretajeActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();

        }
    }

    private void buscarCorretajeColonia(String colonia) {
        resultadosCorretaje = consultaProductos.buscarProductoColoniaCorretaje(colonia);
        numeroProductos = resultadosCorretaje.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            corretajeActual = resultadosCorretaje.get(indiceActual);

            idProducto = corretajeActual.obtenerIdProducto();
            txtNombreClave.setText(corretajeActual.obtenerNombre());
            txtDireccion.setText(corretajeActual.obtenerDireccion());
            txtColonia.setText(corretajeActual.obtenerColonia());
            txtReferencias.setText(corretajeActual.obtenerReferencias());
            cboTipo.setSelectedItem(corretajeActual.obtenerTipo().toString());
            chkVendido.setSelected(corretajeActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();

        }
    }

    private void buscarCorretajeTipo(String tipo) {
        resultadosCorretaje = consultaProductos.buscarCorretajeTipo(tipo);
        numeroProductos = resultadosCorretaje.size();

        if (numeroProductos != 0) {

            indiceActual = 0;
            corretajeActual = resultadosCorretaje.get(indiceActual);

            idProducto = corretajeActual.obtenerIdProducto();
            txtNombreClave.setText(corretajeActual.obtenerNombre());
            txtDireccion.setText(corretajeActual.obtenerDireccion());
            txtColonia.setText(corretajeActual.obtenerColonia());
            txtReferencias.setText(corretajeActual.obtenerReferencias());
            cboTipo.setSelectedItem(corretajeActual.obtenerTipo().toString());
            chkVendido.setSelected(corretajeActual.obtenerVendido());

            txtIndiceActual.setText("" + (indiceActual + 1));
            lblTotal.setText("" + numeroProductos);
            mostrarVisitasEnTabla();

        }
    }

    private void buscarCaracteristicasColonia(String colonia) {
        resultadosCaracteristicasProducto = consultaCaracteristicasProducto.buscarCaracteristicasColonia(colonia);
        numeroCaracteristicasProducto = resultadosCaracteristicasProducto.size();

        if (numeroCaracteristicasProducto != 0) {

            indiceActualCaracteristicas = 0;
            caracteristicasActual = resultadosCaracteristicasProducto.get(indiceActualCaracteristicas);

            idCaracteristicasProducto = caracteristicasActual.obtenerIdCaracteristicasProducto();

            txtNoRecamaras.setValue(caracteristicasActual.obtenerNumeroRecamaras());
            txtNiveles.setValue(caracteristicasActual.obtenerNiveles());
            txtPrecio.setText("" + caracteristicasActual.obtenerPrecio());
            txtTerreno.setText("" + caracteristicasActual.obtenerTerreno());
            txtDescripcion.setText(caracteristicasActual.obtenerDescripcion());
            txtSuperficieConstruida.setText("" + caracteristicasActual.obtenerTerrenoConstruido());
            mostrarVisitasEnTabla();

        } else {
            JOptionPane.showMessageDialog(null, "No se encontraron resultados",
                    "Búsqueda", JOptionPane.INFORMATION_MESSAGE);
            cmdCancelarActionPerformed(null);
        }
    }

    private void acomodarColumnas() {
        tablaResultados.getColumnModel().getColumn(0).setPreferredWidth(1);
        tablaResultados.getColumnModel().getColumn(1).setPreferredWidth(170);
        tablaResultados.getColumnModel().getColumn(2).setPreferredWidth(50);
        tablaResultados.getColumnModel().getColumn(3).setPreferredWidth(20);
        tablaResultados.getColumnModel().getColumn(4).setPreferredWidth(50);
        tablaResultados.getColumnModel().getColumn(5).setPreferredWidth(5);
    }

    private void obtenerClientes() {
        List<Cliente> resultadoClientes = (new ConsultaCliente()).obtenerTodosLosClientes();

        for (int x = 0; x < resultadoClientes.size(); x++) {
            cboCliente.addItem(resultadoClientes.get(x).obtenerNombre());
        }
    }
}

class ModeloTablaVisitas extends AbstractTableModel {

    private final String[] NOMBRE_COLUMNAS = {"ID", "Cliente", "Inmobil",
        "Fecha visita", "Observaciones", "Venta"};
    private PreparedStatement obtenerVisitas;
    private Connection conexion;
    private ResultSet conjuntoResultados;
    private ResultSetMetaData metaDatos;
    private int numeroDeFilas;
    private boolean conectadoABaseDatos = false;

    ModeloTablaVisitas(int idProducto) {

        conexion = FrmPrincipal.conexion;
        conectadoABaseDatos = true;

        try {

            obtenerVisitas = conexion.prepareStatement("SELECT idClientesXProducto, "
                    + "Clientes.Nombre, Producto.Nombre, ClientesXProducto.Fecha, "
                    + "ClientesXProducto.Observaciones, ClientesXProducto.Venta "
                    + "FROM ClientesXProducto JOIN Clientes USING (idCliente) "
                    + "JOIN Producto USING (idProducto) WHERE Producto.idProducto=?");

            realizarConsulta(idProducto);

        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public void realizarConsulta(int idProducto) throws SQLException, IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        obtenerVisitas.setInt(1, idProducto);
        conjuntoResultados = obtenerVisitas.executeQuery();

        metaDatos = conjuntoResultados.getMetaData();

        conjuntoResultados.last();
        numeroDeFilas = conjuntoResultados.getRow();

        fireTableStructureChanged();
    }

    @Override
    public Class getColumnClass(int columna) throws IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        try {
            String nombreClase = metaDatos.getColumnClassName(columna + 1);

            return Class.forName(nombreClase);
        } catch (Exception excepcion) {
            excepcion.printStackTrace();
        }

        return Object.class;
    }

    @Override
    public int getColumnCount() throws IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        try {
            return metaDatos.getColumnCount();
        } catch (SQLException excepcionSql) {
            excepcionSql.printStackTrace();
        }
        return 0;
    }

    @Override
    public String getColumnName(int columna) throws IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        try {
            return NOMBRE_COLUMNAS[columna];

        } catch (Exception excepcion) {
            excepcion.printStackTrace();
        }

        return "";
    }

    @Override
    public int getRowCount() throws IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        return numeroDeFilas;
    }

    @Override
    public Object getValueAt(int fila, int columna) throws IllegalStateException {

        if (!conectadoABaseDatos) {
            throw new IllegalStateException("No hay conexión a la base de datos");
        }

        try {
            conjuntoResultados.absolute(fila + 1);
            return conjuntoResultados.getObject(columna + 1);
        } catch (SQLException excepcionSql) {
            excepcionSql.printStackTrace();
        }

        return "";
    }

    public void desconectarDeBaseDeDatos() {
        if (conectadoABaseDatos) {

            try {
                conjuntoResultados.close();
                conexion.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                conectadoABaseDatos = false;
            }
        }
    }
}